package random;

/**
 * 位 1 的个数
 *
 * 编写一个函数，输入是一个无符号整数（以二进制串的形式），返回其二进制表达式中数字位数为 '1' 的个数（也被称为汉明重量）
 */

public class L191 {

    public static void main(String[] args) {
        System.out.println(hammingWeight(-3));
    }

    /*
    循环检查二进制位
    就是每一位都与 1 进行与运算，不为零表示该位有 1
     */
    public static int hammingWeight(int n) {

        int count = 0;
        for (int i = 0; i < 32; i++) {
            if ((n & (1 << i)) != 0) {
                count++;
            }
        }
        return count;
    }

    /*
    位运算优化
    观察这个运算：n & (n−1)，其预算结果恰为把 n 的二进制位中的最低位的 1 变为 0 之后的结果。
    怎么想到的呀 真的牛逼
    这个式子就是直接把这个东西给最后有 1 的去掉 并变成这个数
     */
    public int hammingWeight1(int n) {
        int ret = 0;
        while (n != 0) {
            n &= n - 1;
            ret++;
        }
        return ret;
    }

/*    作者：LeetCode-Solution
    链接：https://leetcode-cn.com/problems/number-of-1-bits/solution/wei-1de-ge-shu-by-leetcode-solution-jnwf/
    来源：力扣（LeetCode）
    著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。*/
}
